// 与上位机通信，主要使用上位机软件查看波形

/*
 * 作者：勤为本
 * 勤为本的小店：https://shop333183734.taobao.com/
 */

#include "../lib/ls1c_public.h" 
#include "../lib/ls1c_uart.h"
#include "../lib/start.h"
#include "../lib/ls1c_pin.h"
#include "DataScope_DP.h"

// DATASCOPE接UART8，采用引脚GPIO54和GPIO55的第五复用
#define DATASCOPE_UART_TX           (54)    // CAMDATA4/GPIO54/UART8_TX
#define DATASCOPE_UART_RX           (55)    // CAMDATA5/GPIO55/UART8_RX


unsigned char DataScope_OutPut_Buffer[42] = {0};	   //串口发送缓冲区
ls1c_uart_info_t datascope_uart_info = {0};


//函数说明：将单精度浮点数据转成4字节数据并存入指定地址 
//附加说明：用户无需直接操作此函数 
//target:目标单精度数据
//buf:待写入数组
//beg:指定从数组第几个元素开始写入
//函数无返回 
void Float2Byte(float *target,unsigned char *buf,unsigned char beg)
{
    unsigned char *point;
    point = (unsigned char*)target;	  //得到float的地址
    buf[beg]   = point[0];
    buf[beg+1] = point[1];
    buf[beg+2] = point[2];
    buf[beg+3] = point[3];
}
 
 
//函数说明：将待发送通道的单精度浮点数据写入发送缓冲区
//Data：通道数据
//Channel：选择通道（1-10）
//函数无返回 
void DataScope_Get_Channel_Data(float Data,unsigned char Channel)
{
    if ( (Channel > 10) || (Channel == 0) ) return;  //通道个数大于10或等于0，直接跳出，不执行函数
    else
    {
        switch (Channel)
        {
            case 1:  Float2Byte(&Data,DataScope_OutPut_Buffer,1); break;
            case 2:  Float2Byte(&Data,DataScope_OutPut_Buffer,5); break;
            case 3:  Float2Byte(&Data,DataScope_OutPut_Buffer,9); break;
            case 4:  Float2Byte(&Data,DataScope_OutPut_Buffer,13); break;
            case 5:  Float2Byte(&Data,DataScope_OutPut_Buffer,17); break;
            case 6:  Float2Byte(&Data,DataScope_OutPut_Buffer,21); break;
            case 7:  Float2Byte(&Data,DataScope_OutPut_Buffer,25); break;
            case 8:  Float2Byte(&Data,DataScope_OutPut_Buffer,29); break;
            case 9:  Float2Byte(&Data,DataScope_OutPut_Buffer,33); break;
            case 10: Float2Byte(&Data,DataScope_OutPut_Buffer,37); break;
        }
    }	 
}


//函数说明：生成 DataScopeV1.0 能正确识别的帧格式
//Channel_Number，需要发送的通道个数
//返回发送缓冲区数据个数
//返回0表示帧格式生成失败 
unsigned char DataScope_Data_Generate(unsigned char Channel_Number)
{
	if ( (Channel_Number > 10) || (Channel_Number == 0) ) { return 0; }  //通道个数大于10或等于0，直接跳出，不执行函数
    else
    {	
        DataScope_OutPut_Buffer[0] = '$';  //帧头

        switch(Channel_Number)   
        { 
            case 1:   DataScope_OutPut_Buffer[5]  =  5; return  6;  
            case 2:   DataScope_OutPut_Buffer[9]  =  9; return 10;
            case 3:   DataScope_OutPut_Buffer[13] = 13; return 14; 
            case 4:   DataScope_OutPut_Buffer[17] = 17; return 18;
            case 5:   DataScope_OutPut_Buffer[21] = 21; return 22;  
            case 6:   DataScope_OutPut_Buffer[25] = 25; return 26;
            case 7:   DataScope_OutPut_Buffer[29] = 29; return 30; 
            case 8:   DataScope_OutPut_Buffer[33] = 33; return 34; 
            case 9:   DataScope_OutPut_Buffer[37] = 37; return 38;
            case 10:  DataScope_OutPut_Buffer[41] = 41; return 42; 
        }	 
    }
	return 0;
}


// DataScope初始化
void DataScope_Init(void)
{
    // 设置引脚复用
    pin_set_remap(DATASCOPE_UART_TX, PIN_REMAP_FIFTH);
    pin_set_remap(DATASCOPE_UART_RX, PIN_REMAP_FIFTH);

    // 初始化串口
    datascope_uart_info.UARTx       = LS1C_UART8;
    datascope_uart_info.baudrate    = 128000;
    datascope_uart_info.rx_enable   = FALSE;
    uart_init(&datascope_uart_info);

//    uart_print(LS1C_UART8, "uart8 send!\r\n");    // 调试用

    return ;
}


/*
 * 发送一个字节的数据
 * @data 待发送的数据
 */
void DataScope_Send_One_Byte(unsigned char data)
{
    uart_putc(LS1C_UART8, data);
    return ;
}


/*
 * 通过（串口，或蓝牙透传模块）发送指定长度的数据
 * @buffer 待发送的数据
 * @len 待发送的长度
 */
void DataScope_Send_Bytes(unsigned char *buffer, unsigned char len)
{
    unsigned char tmp = 0;

    for (tmp = 0; tmp < len; tmp++)
    {
        DataScope_Send_One_Byte(buffer[tmp]);
    }

    return ;
}


/*
 * 将MPU6050的原始数据发送到上位机显示
 * @gx, gy, gz 为陀螺仪数据
 * @ax, ay, az 为加速度传感器的数据
 * 注意，是从第几个通道开始显示的
 * 为了让欧拉角与原始数据同时在上位机上显示，分别占用不同的通道
 */
void DataScope_Show_original_data(float gx, float gy, float gz, float ax, float ay, float az)
{
    unsigned char send_count = 0;

    // 生成帧
    DataScope_Get_Channel_Data(gx, 1);
    DataScope_Get_Channel_Data(gy, 2);
    DataScope_Get_Channel_Data(gz, 3);
    DataScope_Get_Channel_Data(ax, 4);
    DataScope_Get_Channel_Data(ay, 5);
    DataScope_Get_Channel_Data(az, 6);

    send_count = DataScope_Data_Generate(6);    // 计算待发送的数据长度
    DataScope_Send_Bytes(DataScope_OutPut_Buffer, send_count);  // 发送

    return ;
}


/*
 * 将MPU6050的dmp数据发送到上位机显示
 */
void DataScope_Show_dmp_data(float data1, float data2, float data3, float data4, float data5, float data6)
{
    unsigned char send_count = 0;

    // 生成帧
    DataScope_Get_Channel_Data(data1, 1);
    DataScope_Get_Channel_Data(data2, 2);
    DataScope_Get_Channel_Data(data3, 3);
	DataScope_Get_Channel_Data(data4, 4);
	DataScope_Get_Channel_Data(data5, 5);
	DataScope_Get_Channel_Data(data6, 6);

    send_count = DataScope_Data_Generate(6);    // 计算待发送的字节长度
    DataScope_Send_Bytes(DataScope_OutPut_Buffer, send_count);

    return ;
}




